parser grammar ExpresionesParser;

options {
  language = Java;
  tokenVocab = ExpresionesLexer;
  ASTLabelType = MiArbol;
  output = AST;
  backtrack = true;
}


tokens {
  LISTA_INST;
  DEF_FUNCION;
  LLAMADA_FUN;
}
@header {
  package practica.analizadoresAntlr;
  import practica.arboles.*;
  import java.util.ArrayList;
}
@members {
    public ArrayList<MiArbol> funciones = new ArrayList<MiArbol>();
}

entrada: (instruccion)* -> ^(LISTA_INST instruccion*)
       ;

instruccion : asignacion 
            | operacion
            | funcion
            ;


asignacion : ID ASIGNACION^ expr SEPARADOR!
           ;

funcion :  ID ABRIRPARENTESIS ID CERRARPARENTESIS ASIGNACION expr -> ^(DEF_FUNCION ID ID expr)
        ;
        finally { funciones.add($funcion.tree); }

operacion : expr SEPARADOR!
          ;
 
expr : exp_mult ((MAS^ exp_mult) 
     | (MENOS^ exp_mult))*
     ;
        
     
exp_mult :  exp_base ((ASTERISCO^ exp_base) 
         | (SLASH^ exp_base))*
         ;

exp_base : NUMERO 
         | ABRIRPARENTESIS! expr CERRARPARENTESIS!
         | ABRIRCORCHETE^ expr CERRARCORCHETE!
         | MENOS^ { $MENOS.setType(CAMBIO_SIGNO); } expr
         | ID
         | ID  ABRIRPARENTESIS expr CERRARPARENTESIS -> ^(LLAMADA_FUN ID expr)
         ;